package com.micro.ai.auth.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.micro.ai.auth.dto.MenuCreateRequest;
import com.micro.ai.auth.dto.MenuDTO;
import com.micro.ai.auth.dto.MenuUpdateRequest;
import com.micro.ai.auth.dto.VbenMenuDTO;
import com.micro.ai.auth.entity.MenuI18n;

import java.util.List;

/**
 * 菜单服务接口
 * 
 * @author micro-ai
 * @since 0.0.1
 */
public interface MenuService {

    /**
     * 创建菜单
     * 
     * @param request 创建请求
     * @return 菜单DTO
     */
    MenuDTO createMenu(MenuCreateRequest request);

    /**
     * 更新菜单
     * 
     * @param menuId 菜单ID
     * @param request 更新请求
     * @return 菜单DTO
     */
    MenuDTO updateMenu(String menuId, MenuUpdateRequest request);

    /**
     * 删除菜单
     * 
     * @param menuId 菜单ID
     */
    void deleteMenu(String menuId);

    /**
     * 根据ID获取菜单详情
     * 
     * @param menuId 菜单ID
     * @return 菜单DTO
     */
    MenuDTO getMenuById(String menuId);

    /**
     * 根据编码获取菜单
     * 
     * @param tenantId 租户ID
     * @param code 菜单编码
     * @return 菜单DTO
     */
    MenuDTO getMenuByCode(String tenantId, String code);

    /**
     * 分页查询菜单
     * 
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param tenantId 租户ID
     * @param keyword 关键词
     * @param status 状态
     * @param parentId 父菜单ID
     * @return 分页结果
     */
    Page<MenuDTO> listMenus(int pageNum, int pageSize, String tenantId, String keyword, String status, String parentId);

    /**
     * 获取所有菜单（不分页）
     * 
     * @param tenantId 租户ID
     * @return 菜单列表
     */
    List<MenuDTO> getAllMenus(String tenantId);

    /**
     * 获取菜单树
     * 
     * @param tenantId 租户ID
     * @param parentId 父菜单ID（NULL表示根菜单）
     * @param locale 语言代码（可选）
     * @return 菜单树
     */
    List<MenuDTO> getMenuTree(String tenantId, String parentId, String locale);

    /**
     * 获取用户可访问的菜单
     * 
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @return 菜单列表
     */
    List<MenuDTO> getUserMenus(String userId, String tenantId);

    /**
     * 获取用户可访问的菜单树
     * 
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @param locale 语言代码（可选）
     * @return 菜单树
     */
    List<MenuDTO> getUserMenuTree(String userId, String tenantId, String locale);

    /**
     * 获取用户可访问的菜单树（Vben 标准格式）
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @param locale 语言代码
     * @return Vben 格式菜单树
     */
    List<VbenMenuDTO> getUserMenuTreeVben(String userId, String tenantId, String locale);

    /**
     * 获取角色可访问的菜单
     * 
     * @param roleId 角色ID
     * @param tenantId 租户ID
     * @return 菜单列表
     */
    List<MenuDTO> getRoleMenus(String roleId, String tenantId);

    /**
     * 检查用户是否有菜单访问权限
     * 
     * @param userId 用户ID
     * @param menuCode 菜单编码
     * @param tenantId 租户ID
     * @return 是否有权限
     */
    boolean hasMenuAccess(String userId, String menuCode, String tenantId);

    /**
     * 更新菜单排序
     * 
     * @param menuId 菜单ID
     * @param sortOrder 排序
     */
    void updateMenuSort(String menuId, Integer sortOrder);

    /**
     * 批量更新菜单排序
     * 
     * @param menuIds 菜单ID列表
     * @param sortOrders 排序列表
     */
    void batchUpdateMenuSort(List<String> menuIds, List<Integer> sortOrders);

    /**
     * 复制菜单
     * 
     * @param sourceMenuId 源菜单ID
     * @param targetParentId 目标父菜单ID
     * @param tenantId 租户ID
     * @return 新菜单DTO
     */
    MenuDTO copyMenu(String sourceMenuId, String targetParentId, String tenantId);

    /**
     * 移动菜单
     * 
     * @param menuId 菜单ID
     * @param targetParentId 目标父菜单ID
     * @param tenantId 租户ID
     */
    void moveMenu(String menuId, String targetParentId, String tenantId);

    // ==================== 国际化相关方法 ====================

    /**
     * 获取菜单的国际化信息
     * 
     * @param menuId 菜单ID
     * @return 国际化信息列表
     */
    List<MenuI18n> getMenuI18n(String menuId);

    /**
     * 根据菜单ID和语言代码获取国际化信息
     * 
     * @param menuId 菜单ID
     * @param locale 语言代码
     * @return 国际化信息
     */
    MenuI18n getMenuI18nByLocale(String menuId, String locale);

    /**
     * 保存菜单国际化信息
     * 
     * @param menuId 菜单ID
     * @param i18nList 国际化信息列表
     */
    void saveMenuI18n(String menuId, List<MenuI18n> i18nList);

    /**
     * 删除菜单的国际化信息
     * 
     * @param menuId 菜单ID
     */
    void deleteMenuI18n(String menuId);

    /**
     * 删除菜单的指定语言版本
     * 
     * @param menuId 菜单ID
     * @param locale 语言代码
     */
    void deleteMenuI18nByLocale(String menuId, String locale);
}
